package org.easy.tool.common;

import cn.hutool.core.util.CharsetUtil;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Valley
 * Created by Valley on 2023/7/14 16:08
 */
public class FileUtil {

    /**
     * 功能：将某个路径生成File对象
     */
    public static File file(String filePath) {
        File file = cn.hutool.core.io.FileUtil.file(filePath);
        return mkDirs(file);
    }

    /**
     * 功能：下载网络链接文件到本地地址
     */
    public static long download(String uri, String dest) {
        return HttpUtil.download(uri, dest);
    }

    /**
     * 功能：获取文件输入流，参数是File
     */
    public static InputStream read(File file) {
        return cn.hutool.core.io.FileUtil.getInputStream(file);
    }

    /**
     * 功能：获取文件输入流，参数是文件地址
     */
    public static InputStream read(String path) {
        return cn.hutool.core.io.FileUtil.getInputStream(path);
    }

    /**
     * 功能：获取文件输出流，参数是File
     */
    public static OutputStream write(File file) {
        return cn.hutool.core.io.FileUtil.getOutputStream(file);
    }

    /**
     * 功能：获取文件输出流，参数是文件地址
     */
    public static OutputStream write(String path) {
        return cn.hutool.core.io.FileUtil.getOutputStream(path);
    }


    /**
     * 功能：将某个网络路径生成File对象
     */
    public static File file(URI uri) {
        File file = cn.hutool.core.io.FileUtil.file(uri);
        return mkDirs(file);
    }

    /**
     * 功能：将每个File对象自动生成父文件夹
     */
    public static File mkDirs(File file) {
        if (!file.getParentFile().exists()){
            file.mkdirs();
        }
        return file;
    }

    /**
     * 功能：将每个File对象自动生成父文件夹
     */
    public static void mkDirs(String filePath) {
        File file = new File(filePath);
        if (!file.getParentFile().exists()){
            file.mkdirs();
        }
    }

    /**
     * 功能：将数据按行写入本地文件
     */
    public static boolean writeLines(List<String> dataList, String path) {
        return cn.hutool.core.io.FileUtil.writeLines(dataList, path, CharsetUtil.CHARSET_UTF_8).exists();
    }

    /**
     * 功能：实现文件追加
     */
    public static void append(String path, String content) {
        cn.hutool.core.io.FileUtil.appendUtf8String(content,path);
    }

    /**
     * 功能：实现文件追加
     */
    public static void append(String path, List<String> contentList) {
        contentList.forEach(s->append(path, s));
    }


    /**
     * 功能：将本地文件中的每一行读取出来
     */
    public static List<String> readLines(String path) {
        return cn.hutool.core.io.FileUtil.readLines(path, CharsetUtil.CHARSET_UTF_8);
    }


    /**
     * 功能：将某个路径(xxx/xxx.txt)复制到某个路径(xxx/xxx.txt)
     */
    public static File copyFile(String source, String dest){
        File copy = cn.hutool.core.io.FileUtil.copy(source, dest, true);
        return mkDirs(copy);
    }

    /**
     * 功能：复制某个文件(xxx/xxx.txt)到某个路径(xxx/xxx.txt)
     */
    public static File copyFile(File sourceFile, String dest){
        File destFile = new File(dest);
        File copy = cn.hutool.core.io.FileUtil.copy(sourceFile, destFile, true);
        return mkDirs(copy);
    }


    /**
     * 功能：将文件流写入指定路径(xxx/xxx.txt)
     */
    public static File writeFile(InputStream in, String dest){
        return cn.hutool.core.io.FileUtil.writeFromStream(in, dest);
    }

    /**
     * 功能：删除文件，支持文件和文件夹
     */
    public static boolean delete(File file) {
        return cn.hutool.core.io.FileUtil.del(file);
    }

    /**
     * 功能：删除文件，支持文件和文件夹
     */
    public static boolean delete(String path) {
        return cn.hutool.core.io.FileUtil.del(path);
    }

    /**
     * 功能：通过文件夹，文件名获取文件
     */
    public static File file(String dir, String fineName) {
        return cn.hutool.core.io.FileUtil.file(dir, fineName);
    }

    /**
     * 功能：获取某个文件夹下所有的文件List
     */
    public static List<String> dir(String dir) {
        return cn.hutool.core.io.FileUtil.listFileNames(dir);
    }

    /**
     * 功能：获取某个文件夹下所有的文件List，全称
     */
    public static List<String> dirStr(String dir) {
        return dir(dir).stream()
                .map(s->dir+File.separator+s)
                .collect(Collectors.toList());
    }

    /**
     * 功能：获取某个文件夹下所有的文件List
     */
    public static List<File> dirFile(String dir) {
        return dir(dir).stream()
                .map(s->FileUtil.file(dir, s))
                .collect(Collectors.toList());
    }

    /**
     * 功能：创建临时文件夹
     */
    public static File createTempDir(String path) {
        File file = new File(path);
        if (!file.exists()) file.mkdirs();
        return file;
    }



}
